<?php
/**
 * Classe para controlar o envio de e-mails de uma newsletter
 * @author Renato Lenz @ PC4 Team
 */
class PC4_Util_DispachanteEmail {

	public $data, $texto, $enviar, $enviados, $emails, $descricao;
	
	function __construct($caminho = '') {
		$this->caminho = (!empty($caminho)) ? $caminho : APPPATH . 'models/emails/';
	}
	/**
	 * Inicia um novo envio
	 * @param array $destinatarios - [{nome: email}]
	 * @param string $texto - O texto do corpo do e-mail
	 * @param string $descricao - Uma descrição de controle do envio
	 */
	function novoEnvio($destinatarios, $texto, $descricao = '') {
		$this->data = date('d-m-Y H-i-s');
		$this->texto = $texto;
		$this->emails = $destinatarios;
		$this->descricao = $descricao;
		$this->toArquivo($this->data);
	}
	
	/**
	 * Recupera as informações do envio de um arquivo
	 * @param string $arquivo
	 * @return object $envio - Um objeto com as informações do arquivo
	 * 							{data, texto, aEnviar, enviados, emails:[{nome, email, status}]}
	 */
	function fromArquivo($arquivo) {
		$infos = file($this->caminho . $arquivo . '_info.txt');
		list($this->data, $this->descricao) = explode('|', array_shift($infos));
		$this->texto = implode("\n", $infos);
		
		// carrega e-mails a enviar
		$aEnviar = file($this->caminho . $arquivo . '_enviar.txt');
		$this->emails = array();
		foreach ($aEnviar as $linha) {
			list($nome, $email) = explode('-', $linha);
			$this->emails[$email] = compact('nome', 'email');
			$this->emails[$email]['status'] = 'A enviar';
		}
		$this->enviar = $this->emails;
		// carrega e-mails enviados
		$this->enviados = array();
		if (file_exists($this->caminho . $arquivo . '_enviados.txt')) {
			$enviados = file($this->caminho . $arquivo . '_enviados.txt');
			foreach ($enviados as $email) {
				if (empty($email)) {
					continue;
				}
				//list($nome, $email) = explode('-', $linha);
				//$this->enviados[$email] = compact('nome', 'email');
				$this->enviados[$email] = $email;
				$this->emails[$email]['status'] = 'Ok';
				unset($this->enviar[$email]);
			}
		}
	}
	
	/**
	 * Salva as informações em um arquivo
	 * @param string $arquivo
	 */
	function toArquivo($arquivo) {
		// salva as informações de envio 
		$arqInfo = fopen($this->caminho . $arquivo . '_info.txt', 'w');
		fwrite($arqInfo, $this->data . '|' . $this->descricao . "\n");
		fwrite($arqInfo, $this->texto);
		fclose($arqInfo);
		
		// salva os e-mails a serem enviados
		$arqEnviar = fopen($this->caminho . $arquivo . '_enviar.txt', 'w');
		foreach ($this->emails as $email) {
			if (!empty($email['email'])) {
				fwrite($arqEnviar, $email['nome'] . '-' . $email['email'] . "\n");
			}
		}
		fclose($arqEnviar);
	}
	
	function envia($arquivo) {
		$this->fromArquivo($arquivo);
		$emailSender = new PC4_Util_Email();

		$i = 0;
		while ($i++ < 2 && ($email = array_shift($this->enviar)) != null) {
			if (empty($email['email'])) {
				continue;
			}

			// envia o e-mail
			$emailSender->sendMail($this->descricao, $this->texto, $email['email'], 'no_reply@no_reply.com');
			
			// salva o e-mail enviado
			$arqEnviados = fopen($this->caminho . $arquivo . '_enviados.txt', 'a');
			fwrite($arqEnviados, $email['email']);// . "\n");
			fclose($arqEnviados);
			
			$this->enviados[] = $email['email'];
		}
	}
	
}